package com.som.service.excel;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.IOUtils;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Row;

import com.som.beanconvert.ExcelDataParseInputInf;
import com.som.beanconvert.ExcelRowDataParseProcessInf;
import com.som.console.ErrorCode;
import com.som.console.ExcelProcException;

/**
 * 进行excel的读取操作
 * 
 * @author liujun
 * @date 2016年4月8日
 * @verion 0.0.1
 */
public abstract class ExcelReadProcess<K, T>
{
	/**
	 * 通过过此抽换方法调用实现
	 * 
	 * @return
	 */
	protected abstract ExcelDataParseInputInf<T> getParseBean();

	/**
	 * 得到行数据转换对象信息
	 * 
	 * @return
	 */
	protected abstract ExcelRowDataParseProcessInf<K, T> getRowParseBean();

	/**
	 * 读取Excel数据转换成集合数据
	 * 
	 * @param path
	 *            excel路径
	 * @return 结果
	 */
	@SuppressWarnings("resource")
	public List<T> readExcelDataList(String path, int sheeet, boolean isjumpFist)throws ExcelProcException
	{
		List<T> list = new LinkedList<T>();

		POIFSFileSystem fs = null;
		try
		{
			fs = new POIFSFileSystem(new FileInputStream(path));

			// 得到Excel工作簿对象
			HSSFWorkbook wookbook = new HSSFWorkbook(fs);
			// 得到Excel工作表对象
			HSSFSheet sheet = wookbook.getSheetAt(sheeet);

			// 得到总行数
			Iterator<Row> iterRow = sheet.iterator();

			// 得到转换对象
			ExcelDataParseInputInf<T> parseBean = getParseBean();

			while (iterRow.hasNext())
			{
				// 得到Excel工作表的行
				Row row = iterRow.next();

				if (isjumpFist)
				{
					isjumpFist = false;
					continue;
				}

				list.add(parseBean.parseBean(row));
			}

		} catch (FileNotFoundException e)
		{
			e.printStackTrace();
			throw new ExcelProcException(ErrorCode.FILE_NOTFOUNT.getMsg());
		} catch (IOException e)
		{
			e.printStackTrace();
			throw new ExcelProcException(ErrorCode.FILE_FILE_IS_ERROR.getMsg());
		} finally
		{
			IOUtils.closeQuietly(fs);
		}

		return list;
	}

	/**
	 * 读取Excel数据转换成map对象信息
	 * 
	 * @param path
	 *            excel路径
	 * @return 结果
	 */
	@SuppressWarnings("resource")
	public Map<K, T> readExcelDataMap(String path, int sheeet, boolean isjumpFist) throws ExcelProcException
	{
		Map<K, T> resultMap = new LinkedHashMap<K, T>();

		POIFSFileSystem fs = null;
		try
		{
			fs = new POIFSFileSystem(new FileInputStream(path));

			// 得到Excel工作簿对象
			HSSFWorkbook wookbook = new HSSFWorkbook(fs);
			// 得到Excel工作表对象
			HSSFSheet sheet = wookbook.getSheetAt(sheeet);

			// 得到总行数
			Iterator<Row> iterRow = sheet.iterator();

			// 得到转换对象
			ExcelDataParseInputInf<T> parseBean = getParseBean();
			// 得到行数据转换接口
			ExcelRowDataParseProcessInf<K, T> rowParse = getRowParseBean();

			while (iterRow.hasNext())
			{
				// 得到Excel工作表的行
				Row row = iterRow.next();

				if (isjumpFist)
				{
					isjumpFist = false;
					continue;
				}
				// 将excel的数据转换成java对象
				T bean = parseBean.parseBean(row);

				// 将提取的行数据转换成集体对象
				Map<K, T> rowMapInfo = rowParse.parseRowDataProcess(bean);

				if (null != rowMapInfo)
				{
					// 将当前临时集体放入到大数据中
					resultMap.putAll(rowMapInfo);
				}
				rowMapInfo = null;
			}

		} catch (FileNotFoundException e)
		{
			e.printStackTrace();
			throw new ExcelProcException(ErrorCode.FILE_NOTFOUNT.getMsg());
		} catch (IOException e)
		{
			e.printStackTrace();
			throw new ExcelProcException(ErrorCode.FILE_FILE_IS_ERROR.getMsg());
		} finally
		{
			IOUtils.closeQuietly(fs);
		}

		return resultMap;
	}
}
